OpenZFS on Linux and FreeBSD
Go to file
Peng 4f96e68fad Fix PANIC: metaslab_free_dva(): bad DVA X:Y:Z
The following scenario can result in garbage in the dn_spill field.
The db->db_blkptr must be set to NULL when DNODE_FLAG_SPILL_BLKPTR
is clear to ensure the dn_spill field is cleared.

Current txg = A.
* A new spill buffer is created. Its dbuf is initialized with
  db_blkptr = NULL and it's dirtied.

Current txg = B.
* The spill buffer is modified. It's marked as dirty in this txg.
* Additional changes make the spill buffer unnecessary because the
  xattr fits into the bonus buffer, so it's removed. The dbuf is
  undirtied in this txg, but it's still referenced and cannot be
  destroyed.

Current txg = C.
* Starts syncing of txg A
* dbuf_sync_leaf() is called for the spill buffer. Since db_blkptr
  is NULL, dbuf_check_blkptr() is called.
* The dbuf starts being written and it reaches the ready state
  (not done yet).
* A new change makes the spill buffer necessary again.
  sa_build_layouts() ends up calling dbuf_find() to locate the
  dbuf.  It finds the old dbuf because it has not been destroyed yet
  (it will be destroyed when the previous write is done and there
  are no more references). The old dbuf has db_blkptr != NULL.
* txg A write is complete and the dbuf released. However it's still
  referenced, so it's not destroyed.

Current txg = D.
* Starts syncing of txg B
* dbuf_sync_leaf() is called for the bonus buffer. Its contents are
  directly copied into the dnode, overwriting the blkptr area because,
  in txg B, the bonus buffer was big enough to hold the entire xattr.
* At this point, the db_blkptr of the spill buffer used in txg C
  gets corrupted.

Signed-off-by: Peng <peng.hse@xtaotech.com>
Signed-off-by: Tim Chase <tim@chase2k.com>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #3937
2016-09-05 16:07:09 -07:00
cmd Use udev for partition detection 2016-05-06 18:22:34 -04:00
config Linux 4.7 compat: fix zpl_get_acl returns invalid acl pointer 2016-09-05 16:07:08 -07:00
contrib Init script fixes 2015-09-29 15:27:14 -07:00
etc Systemd configuration fixes 2016-09-05 16:07:09 -07:00
include Retire HAVE_CURRENT_UMASK and HAVE_POSIX_ACL_CACHING 2016-09-05 16:07:08 -07:00
lib Illumos 4953, 4954, 4955 2016-09-05 16:07:08 -07:00
man Change full path subcommand flag from -p to -P 2016-03-22 17:54:07 -07:00
module Fix PANIC: metaslab_free_dva(): bad DVA X:Y:Z 2016-09-05 16:07:09 -07:00
rpm Prepare to tag zfs-0.6.5.7 2016-05-12 19:35:49 -07:00
scripts Add support for asynchronous zvol minor operations 2016-03-22 18:08:04 -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 Prepare to tag zfs-0.6.5.7 2016-05-12 19:35:49 -07:00
Makefile.am Add `make lint` target 2016-09-05 16:07:08 -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 Follow 0/-E convention for module load errors 2015-12-23 17:29:35 -08:00
autogen.sh build: do not call boilerplate ourself 2013-04-02 10:55:20 -07:00
configure.ac Move dracut directory to contrib 2015-07-09 13:59:37 -07:00
copy-builtin Fix --enable-linux-builtin 2015-12-23 17:29:34 -08:00
zfs-script-config.sh.in Initial implementation of zed (ZFS Event Daemon) 2014-04-02 13:10:03 -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