]> git.proxmox.com Git - mirror_zfs.git/commit - module/zfs/arc.c
Fixes for #6639
authorTom Caputi <tcaputi@datto.com>
Thu, 28 Sep 2017 15:49:13 +0000 (11:49 -0400)
committerTom Caputi <tcaputi@datto.com>
Wed, 11 Oct 2017 20:55:50 +0000 (16:55 -0400)
commit440a3eb939441a42ab5029e5e64498d802fa276b
tree5b2b958c6d4d96d4f4f9a930b0c291318fad51ff
parent4807c0badb130ae70cf6f0887b4be1648f217f1a
Fixes for #6639

Several issues were uncovered by running stress tests with zfs
encryption and raw sends in particular. The issues and their
associated fixes are as follows:

* arc_read_done() has the ability to chain several requests for
  the same block of data via the arc_callback_t struct. In these
  cases, the ARC would only use the first request's dsobj from
  the bookmark to decrypt the data. This is problematic because
  the first request might be a prefetch zio which is able to
  handle the key not being loaded, while the second might use a
  different key that it is sure will work. The fix here is to
  pass the dsobj with each individual arc_callback_t so that each
  request can attempt to decrypt the data separately.

* DRR_FREE and DRR_FREEOBJECT records in a send file were not
  having their transactions properly tagged as raw during raw
  sends, which caused a panic when the dbuf code attempted to
  decrypt these blocks.

* traverse_prefetch_metadata() did not properly set
  ZIO_FLAG_SPECULATIVE when issuing prefetch IOs.

* Added a few asserts and code cleanups to ensure these issues
  are more detectable in the future.

Signed-off-by: Tom Caputi <tcaputi@datto.com>
cmd/ztest/ztest.c
include/sys/arc_impl.h
include/sys/dmu.h
module/zfs/arc.c
module/zfs/dbuf.c
module/zfs/dmu.c
module/zfs/dmu_send.c
module/zfs/dmu_traverse.c
module/zfs/zfs_vnops.c