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/spl/THIRDPARTYLICENSE.gplv2
  * GCM Implementaion: module/icp/asm-x86_64/modes/THIRDPARTYLICENSE.cryptogams
  * GCM Implementaion: module/icp/asm-x86_64/modes/THIRDPARTYLICENSE.openssl
  * GHASH Implementaion: module/icp/asm-x86_64/modes/THIRDPARTYLICENSE.cryptogams
  * GHASH Implementaion: 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.
