Refer to the git commit log for authoritative copyright attribution.

The original ZFS source code was obtained from Open Solaris which was
released under the terms of the CDDL open source license.  Additional
changes have been included from OpenZFS and the Illumos project which
are similarly licensed.  These projects can be found on Github at:

  * https://github.com/illumos/illumos-gate
  * https://github.com/openzfs/openzfs

Unless otherwise noted, all files in this distribution are released
under the Common Development and Distribution License (CDDL).

Exceptions are noted within the associated source files headers and
by including a THIRDPARTYLICENSE file with the license terms.  A few
notable exceptions and their respective licenses include:

  * Skein Checksum Implementation: module/icp/algs/skein/THIRDPARTYLICENSE
  * AES Implementation: module/icp/asm-x86_64/aes/THIRDPARTYLICENSE.gladman
  * AES Implementation: module/icp/asm-x86_64/aes/THIRDPARTYLICENSE.openssl
  * PBKDF2 Implementation: lib/libzfs/THIRDPARTYLICENSE.openssl
  * SPL Implementation: module/os/linux/spl/THIRDPARTYLICENSE.gplv2
  * GCM Implementation: module/icp/asm-x86_64/modes/THIRDPARTYLICENSE.cryptogams
  * GCM Implementation: module/icp/asm-x86_64/modes/THIRDPARTYLICENSE.openssl
  * GHASH Implementation: module/icp/asm-x86_64/modes/THIRDPARTYLICENSE.cryptogams
  * GHASH Implementation: module/icp/asm-x86_64/modes/THIRDPARTYLICENSE.openssl

This product includes software developed by the OpenSSL Project for use
in the OpenSSL Toolkit (http://www.openssl.org/)

See the LICENSE and NOTICE for more information.
