OpenZFS on Linux and FreeBSD
Go to file
Alex Reece 463a8cfe2b Illumos 6844 - dnode_next_offset can detect fictional holes
6844 dnode_next_offset can detect fictional holes
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Reviewed by: George Wilson <george.wilson@delphix.com>
Reviewed by: Brian Behlendorf <behlendorf1@llnl.gov>

dnode_next_offset is used in a variety of places to iterate over the
holes or allocated blocks in a dnode. It operates under the premise that
it can iterate over the blockpointers of a dnode in open context while
holding only the dn_struct_rwlock as reader. Unfortunately, this premise
does not hold.

When we create the zio for a dbuf, we pass in the actual block pointer
in the indirect block above that dbuf. When we later zero the bp in
zio_write_compress, we are directly modifying the bp. The state of the
bp is now inconsistent from the perspective of dnode_next_offset: the bp
will appear to be a hole until zio_dva_allocate finally finishes filling
it in. In the meantime, dnode_next_offset can detect a hole in the dnode
when none exists.

I was able to experimentally demonstrate this behavior with the
following setup:
1. Create a file with 1 million dbufs.
2. Create a thread that randomly dirties L2 blocks by writing to the
first L0 block under them.
3. Observe dnode_next_offset, waiting for it to skip over a hole in the
middle of a file.
4. Do dnode_next_offset in a loop until we skip over such a non-existent
hole.

The fix is to ensure that it is valid to iterate over the indirect
blocks in a dnode while holding the dn_struct_rwlock by passing the zio
a copy of the BP and updating the actual BP in dbuf_write_ready while
holding the lock.

References:
  https://www.illumos.org/issues/6844
  https://github.com/openzfs/openzfs/pull/82
  DLPX-35372

Ported-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #4548
2016-04-27 16:24:15 -07:00
cmd Illumos 6659 - nvlist_free(NULL) is a no-op 2016-04-27 15:58:23 -07:00
config Linux 4.5 compat: Use xattr_handler->name for acl 2016-04-25 08:42:08 -07:00
contrib fix booting via dracut generated initramfs 2016-04-25 08:51:38 -07:00
etc Add support for alpine linux 2016-03-08 13:19:53 -08:00
include Illumos 6844 - dnode_next_offset can detect fictional holes 2016-04-27 16:24:15 -07:00
lib Illumos 6659 - nvlist_free(NULL) is a no-op 2016-04-27 15:58:23 -07:00
man Add support for devid and phys_path keys in vdev disk labels 2016-03-31 13:45:53 -07:00
module Illumos 6844 - dnode_next_offset can detect fictional holes 2016-04-27 16:24:15 -07:00
rpm Add the ZFS Test Suite 2016-03-16 13:46:16 -07:00
scripts Make zfs test easier to run in local install 2016-04-12 10:50:01 -07:00
tests Fix zfs_copies_001_pos/zfs_copies_004_neg 2016-04-27 15:58:11 -07:00
udev Support parallel build trees (VPATH builds) 2015-07-17 13:42:51 -07:00
.gitignore Ignore *.{deb,rpm,tar.gz} files in the top directory. 2013-04-24 16:18:59 -07:00
.gitmodules Add zimport.sh compatibility test script 2014-02-21 12:10:31 -08:00
AUTHORS Add a missing > to AUTHORS 2014-09-02 14:18:53 -07:00
COPYRIGHT Update ZED copyright boilerplate 2015-05-11 15:07:00 -07:00
DISCLAIMER Fix minor typos and update marketing copy. 2013-03-21 12:51:06 -07:00
META Tag zfs-0.6.5 2015-09-11 11:16:38 -07:00
Makefile.am Add the ZFS Test Suite 2016-03-16 13:46:16 -07:00
OPENSOLARIS.LICENSE Add CDDL license file 2008-12-01 14:49:34 -08:00
README.markdown Fix minor typos and update marketing copy. 2013-03-21 12:51:06 -07:00
TEST Add the ZFS Test Suite 2016-03-16 13:46:16 -07:00
autogen.sh build: do not call boilerplate ourself 2013-04-02 10:55:20 -07:00
configure.ac fix booting via dracut generated initramfs 2016-04-25 08:51:38 -07:00
copy-builtin Fix --enable-linux-builtin 2015-12-02 07:54:32 -08:00
zfs-script-config.sh.in Add zloop.sh test script 2016-03-23 16:12:25 -07:00
zfs.release.in Move zfs.release generation to configure step 2012-07-12 12:22:51 -07:00

README.markdown

Native ZFS for Linux!

ZFS is an advanced file system and volume manager which was originally developed for Solaris and is now maintained by the Illumos community.

ZFS on Linux, which is also known as ZoL, is currently feature complete. It includes fully functional and stable SPA, DMU, ZVOL, and ZPL layers.

Full documentation for installing ZoL on your favorite Linux distribution can be found at: http://zfsonlinux.org