hammer2 - Fix focus vs modify race
commitfda30e02bc0f8ddfe436df9a4fa2b0bacb9287fd
authorMatthew Dillon <dillon@apollo.backplane.com>
Fri, 25 May 2018 02:22:52 +0000 (24 19:22 -0700)
committerMatthew Dillon <dillon@apollo.backplane.com>
Sat, 26 May 2018 18:18:32 +0000 (26 11:18 -0700)
tree578cfa443105e1f18dfe15b265dd1c8ef94c96ac
parent2c55414c9508bf10e7c762c587c97749058ec5d4
hammer2 - Fix focus vs modify race

* Fixes rare panics when e.g. removing large numbers (as in hundreds of
  millions) of directory entries.

  The XOP collection code holds the collected cluster but cannot
  safely lock it without risking a deadlock against backend operations
  or dead backends.  The hold on the chain prevents its destruction,
  but does not prevent another thread from locking it and issuing
  hammer2_chain_modify().

* Fix bugs due to the unsafe nature of an unlocked chain's content,
  especially chain->data and chain->dio, by adding an interlock between
  frontend access to the data and backend hammer2_chain_modify() calls.
  Held but unlocked chains are used by the XOP API to pass chains back to
  the frontend.

* Remove the automatic (because it is unsafe) dio synchronization
  in hammer2_xop_collect() and instead implement an API that the
  frontend can use to safely access the data. The API is
  hammer2_xop_gdata()/hammer2_xop_pdata().

* Remove the unsafe hammer2_cluster_rdata().  Use gdata/pdata for this
  too.

* Rewire hammer2_inode_get() to pass-in a hammer2_xop_head instead
  of a hammer2_cluster so it can use the gdata/pdata API too.
sys/vfs/hammer2/hammer2.h
sys/vfs/hammer2/hammer2_admin.c
sys/vfs/hammer2/hammer2_chain.c
sys/vfs/hammer2/hammer2_cluster.c
sys/vfs/hammer2/hammer2_inode.c
sys/vfs/hammer2/hammer2_io.c
sys/vfs/hammer2/hammer2_ioctl.c
sys/vfs/hammer2/hammer2_strategy.c
sys/vfs/hammer2/hammer2_synchro.c
sys/vfs/hammer2/hammer2_vfsops.c
sys/vfs/hammer2/hammer2_vnops.c