HAMMER VFS - Fix over-enthusiastic cluster read
authorMatthew Dillon <dillon@apollo.backplane.com>
Sun, 15 Aug 2010 15:14:53 +0000 (08:14 -0700)
committerMatthew Dillon <dillon@apollo.backplane.com>
Sun, 15 Aug 2010 15:14:53 +0000 (08:14 -0700)
commit06b113947ac0a810bbb3d53ea14cc0dfe7ce40bb
tree16f87231d8286d372a74aab259172f6036f33625
parent53d77b810f036281b8ab65c1cea770f9060bd3c0
HAMMER VFS - Fix over-enthusiastic cluster read

* The block device I/O was over-enthusiastic in calling cluster_read()
  and could wind up creating the buffers of the wrong size which
  would then overlap the address space later buffer requests for the
  right size.

  This could result in the corruption of large-data (64K) blocks,
  usually causing a hammer reblock to fail with a CRC error but
  not corrupting the actual filesystem on-media.

  Meta data could not usually get corrupted by this unless the
  cluster-read happened to cross a large-block (8MB) boundary.

* Particularly easy to reproduce with the dm_crypt module due to
  crypt overheads.

* Fixed by disallowing read-aheads in the large-data zone (the only
  zone which can contain a mix of 16K and 64K blocks), and ensuring
  that any other cluster_read does not cross a large-block boundary.
sys/vfs/hammer/hammer_io.c