git: hammer2 - Merge Daniel Flores's HAMMER2 GSOC project into the main tree

Matthew Dillon dillon at
Wed Sep 18 20:24:59 PDT 2013

commit 355d67fcd81e0a7b17007d691bb00bdd151f3d28
Author: Matthew Dillon <dillon at>
Date:   Wed Sep 18 19:56:07 2013 -0700

    hammer2 - Merge Daniel Flores's HAMMER2 GSOC project into the main tree
    * This merge contains work primarily by Daniel Flores, and also by
      Matthew Dillon.  Daniel's work is focused around adding the compression
      infrastructure while my work was focused around changing HAMMER2's
      I/O infrastructure to work with the compression code.
      Daniel's work involved adding the compression functions and heuristics,
      modifying mainly vnops and vfsops to use them, adding the new buffer
      cache write thread, and adding the new hammer2 utility directives and
      related ioctls.
      My work involved changing the H2 I/O infrastructure to always double-buffer
      (i.e. logical buffers vs device buffers) because device buffers can now
      wind up being a different size than the related logical buffers.  I also
      had to make changes to the hammer2_mount and hammer2_pfsmount mechanics
      and other things to prevent deadlocks.
    			    Daniel's Work
    * Add the hammer2 setcomp directive which sets the compression mode on a
      directory or file.  If applie to a directory, the compression mode is
      inherited by any new files or directories created under the directory.
      Pre-existing subdirectories and files are not affected.
      The directive has a recursive option to recurse down and set the mode on
      everything underneath.
    * Add wthread_bioq and related fields to hammer2_mount to support a
      buffer cache buffer writing thread.  This thread is responsible for
      calculating compression sizes, allocating device buffer blocks, and
      compressing logical buffers into the device buffers.
      compression modes.  AUTOZERO is the zero-block detection code.  LZ4 will
      do zero-block-detection and LZ4 otherwise, and ZLIB will do
      zero-block-detection and gzip otherwise.
      This work entails a ton of new files imported from the LZ4 and ZLIB
      projects plus lots of wiring.
      The new files had to be cleaned up considerably, as well, since they
      were originally intended for userland.
    * Move synchronous device buffer handling out of hammer2_vop_write() and
      into the support thread.  Numerous procedures were moved out of
      hammer2_vnops.c and into hammer2_vfsops.c as well.
      This greatly simplifies hammer2_vop_write() as well as the truncate and
      extend code, and improves the critical-path performance for write()
      (at least until the buffer cache fills up or gets too far behind).
    * Implement semi-synchronous decompression callbacks for read I/O and
      read-ahead I/O.
      ioctls to support the setcomp directive.
    			  Matthew's Work
    * The hammer2_inode copies additional fields from the inode data, allowing
      the inode data to be deallocated after use.
    * Due to the way the buffer cache now operates, multiple deletions of the
      same chain key can occur within the same transaction.  Adjust the RBTREE
      compare code to handle the case.
    * Track chain structure use on a pfsmount-by-pfsmount basis for current
      and future management of the kmalloc pools used by hammer2.
    * Rework the way inodes are locked to track chain modifications.
    * Rewrite hammer2_chain_delete_duplicate().
    * Rewrite hammer2_trans_init() and the flush code primarily to fix
      deadlocks in the flush synchronization mechanics.
    * Interlock very low level chain operations with a spin lock instead
      of the full-blown chain lock to deal with potential deadlocks and
      fix a few SMP races.
    * For the moment make all logical buffers 64KB.  Not efficient for small
      files and will be changed back at some point but necessary for efficient
      compression at the moment.
    * Implement an asynchronous buffer cache callback feature.
    * Use a localized in-hammer2_inode-structure size field for frontend
      operations, including extend and truncate, to remove confusion against
      backend flushes.  This way the inode data can be modified only during
      the flush and not before where it might cause confusion with previously
      staged flushes.

Summary of changes:
 sbin/hammer2/Makefile                              |    2 +-
 sbin/hammer2/cmd_setcomp.c                         |  219 ++++
 sbin/hammer2/cmd_stat.c                            |    3 +-
 sbin/hammer2/hammer2.h                             |    7 +
 sbin/hammer2/main.c                                |   20 +
 sbin/hammer2/print_inode.c                         |   81 ++
 sys/vfs/hammer2/Makefile                           |    7 +-
 sys/vfs/hammer2/hammer2.h                          |   40 +-
 sys/vfs/hammer2/hammer2_chain.c                    |  207 +++-
 sys/vfs/hammer2/hammer2_disk.h                     |    4 +-
 sys/vfs/hammer2/hammer2_flush.c                    |  106 +-
 sys/vfs/hammer2/hammer2_freemap.c                  |    8 +
 sys/vfs/hammer2/hammer2_inode.c                    |  100 +-
 sys/vfs/hammer2/hammer2_ioctl.c                    |   40 +
 sys/vfs/hammer2/hammer2_ioctl.h                    |    4 +
 sys/vfs/hammer2/hammer2_lz4.c                      |  526 +++++++++
 sys/vfs/hammer2/hammer2_lz4.h                      |   93 ++
 sys/vfs/hammer2/hammer2_lz4_encoder.h              |  467 ++++++++
 sys/vfs/hammer2/hammer2_subr.c                     |   70 +-
 sys/vfs/hammer2/hammer2_vfsops.c                   |  726 +++++++++++-
 sys/vfs/hammer2/hammer2_vnops.c                    |  956 ++++++---------
 sys/vfs/hammer2/zlib/hammer2_zlib.h                |  551 +++++++++
 sys/vfs/hammer2/zlib/hammer2_zlib_adler32.c        |  175 +++
 sys/vfs/hammer2/zlib/hammer2_zlib_deflate.c        | 1210 +++++++++++++++++++
 sys/vfs/hammer2/zlib/hammer2_zlib_deflate.h        |  337 ++++++
 sys/vfs/hammer2/zlib/hammer2_zlib_inffast.c        |  340 ++++++
 sys/vfs/hammer2/zlib/hammer2_zlib_inffast.h        |   11 +
 .../vfs/hammer2/zlib/hammer2_zlib_inffixed.h       |    0
 sys/vfs/hammer2/zlib/hammer2_zlib_inflate.c        | 1052 +++++++++++++++++
 sys/vfs/hammer2/zlib/hammer2_zlib_inflate.h        |  113 ++
 sys/vfs/hammer2/zlib/hammer2_zlib_inftrees.c       |  304 +++++
 sys/vfs/hammer2/zlib/hammer2_zlib_inftrees.h       |   62 +
 sys/vfs/hammer2/zlib/hammer2_zlib_trees.c          | 1232 ++++++++++++++++++++
 .../vfs/hammer2/zlib/hammer2_zlib_trees.h          |    0
 sys/vfs/hammer2/zlib/hammer2_zlib_zconf.h          |  289 +++++
 sys/vfs/hammer2/zlib/hammer2_zlib_zutil.c          |  178 +++
 sys/vfs/hammer2/zlib/hammer2_zlib_zutil.h          |  148 +++
 37 files changed, 8988 insertions(+), 700 deletions(-)
 create mode 100644 sbin/hammer2/cmd_setcomp.c
 create mode 100644 sbin/hammer2/print_inode.c
 create mode 100644 sys/vfs/hammer2/hammer2_lz4.c
 create mode 100644 sys/vfs/hammer2/hammer2_lz4.h
 create mode 100644 sys/vfs/hammer2/hammer2_lz4_encoder.h
 create mode 100644 sys/vfs/hammer2/zlib/hammer2_zlib.h
 create mode 100644 sys/vfs/hammer2/zlib/hammer2_zlib_adler32.c
 create mode 100644 sys/vfs/hammer2/zlib/hammer2_zlib_deflate.c
 create mode 100644 sys/vfs/hammer2/zlib/hammer2_zlib_deflate.h
 create mode 100644 sys/vfs/hammer2/zlib/hammer2_zlib_inffast.c
 create mode 100644 sys/vfs/hammer2/zlib/hammer2_zlib_inffast.h
 copy contrib/zlib-1.2/inffixed.h => sys/vfs/hammer2/zlib/hammer2_zlib_inffixed.h (100%)
 create mode 100644 sys/vfs/hammer2/zlib/hammer2_zlib_inflate.c
 create mode 100644 sys/vfs/hammer2/zlib/hammer2_zlib_inflate.h
 create mode 100644 sys/vfs/hammer2/zlib/hammer2_zlib_inftrees.c
 create mode 100644 sys/vfs/hammer2/zlib/hammer2_zlib_inftrees.h
 create mode 100644 sys/vfs/hammer2/zlib/hammer2_zlib_trees.c
 copy contrib/zlib-1.2/trees.h => sys/vfs/hammer2/zlib/hammer2_zlib_trees.h (100%)
 create mode 100644 sys/vfs/hammer2/zlib/hammer2_zlib_zconf.h
 create mode 100644 sys/vfs/hammer2/zlib/hammer2_zlib_zutil.c
 create mode 100644 sys/vfs/hammer2/zlib/hammer2_zlib_zutil.h

DragonFly BSD source repository

More information about the Commits mailing list