HAMMER VFS - Fix probable corruption case when filesystem becomes nearly full v2.6.2
authorMatthew Dillon <dillon@apollo.backplane.com>
Mon, 19 Apr 2010 05:36:14 +0000 (22:36 -0700)
committerMatthew Dillon <dillon@apollo.backplane.com>
Mon, 19 Apr 2010 05:59:02 +0000 (22:59 -0700)
commit582fd80b76c21844ed8b658043bd446e637bacc8
treeb33a6307e16030bef85c4b1162e1dd425f2b016b
parentc2d1415223a09dd0be21eb0a124ab838e425bba9
HAMMER VFS - Fix probable corruption case when filesystem becomes nearly full

* The reblocking code was incorrectly assuming the cursor would be pointing
  at a valid node element after an unlock/relock sequence, when it could
  actually be pointing at the EOF of a node.  This case can occur when
  the filesystem is nearly full (possibly due to the reblocking operation
  itself), when the filesystem is also under load from unrelated
  operations.

* This can result in the creation of a corrupted B-Tree leaf node or
  data record.

* Corruption can be checked with hammer checkmap and hammer show
  (as of this rev):

  hammer -f device checkmap

Should output no B-Tree node records or free space mismatches.
You will still get the initial volume summary.

  hammer -f device show | egrep '^B' | egrep -v '^BM'

Should output no records.

* Currently the only recourse if corruption is found is to copy off the
  filesystem, newfs_hammer, and copy it back.

  Full history and snapshots can be retained by using 'hammer -B mirror-read'
  to copy off the filesystem and mirror-write to copy it back.  However,
  pleaes remember you must do this for each PFS individually.  Make sure
  you have a viable backup before newfsing anything.

Reported-by: Francois Tigeot <ftigeot@wolfpond.org>, Jan Lentfer <Jan.Lentfer@web.de>
sys/vfs/hammer/hammer_reblock.c