mirror_zfs/module
Matthew Ahrens 948423a3d1
zfs promote does not delete livelist of origin
When a clone is promoted, its livelist is no longer accurate, so it is
discarded.  If the clone's origin is also a clone (i.e. we are promoting
a clone of a clone), then the origin's livelist is also no longer
accurate, so it should be discarded, but the code doesn't actually do
that.

Consider a pool with:
* Filesystem A
* Clone B, a clone of A
* Clone C, a clone of B

If we promote C, it discards C's livelist.  It should discard B's
livelist, but that is not happening.  The impact is that when B is
destroyed, we use the livelist to find the blocks to free, but the
livelist is no longer correct so we end up freeing blocks that are still
in use by C.  The incorrectly-freed blocks can be reallocated causing
checksum errors.  And when C is destroyed it can double-free the
incorrectly-freed blocks.

The problem is that we remove the livelist of `origin_ds->ds_dir`, but
the origin snapshot has already been moved to the promoted dsl_dir.  So
this is actually trying to remove the livelist of the promoted dsl_dir,
which was already removed.  As explained in a comment in the beginning
of `dsl_dataset_promote_sync()`, we need to use the saved `odd` for the
origin's dsl_dir.

Reviewed-by: Pavel Zakharov <pavel.zakharov@delphix.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: George Wilson <gwilson@delphix.com>
Reviewed by: Sara Hartse <sara.hartse@delphix.com>
Signed-off-by: Matthew Ahrens <mahrens@delphix.com>
Closes #10652
2020-07-31 08:59:00 -07:00
..
avl Make use of ZFS_DEBUG consistent within kmod sources 2020-07-25 20:07:44 -07:00
icp Prefix zfs internal endian checks with _ZFS 2020-07-28 13:02:49 -07:00
lua Fix lua stack overflow on recursive call to gsub() 2020-07-27 16:11:47 -07:00
nvpair Prefix zfs internal endian checks with _ZFS 2020-07-28 13:02:49 -07:00
os Rename refcount.h to zfs_refcount.h 2020-07-29 16:35:33 -07:00
spl Cleanup linux module kbuild files 2020-06-10 09:24:15 -07:00
unicode Prefix zfs internal endian checks with _ZFS 2020-07-28 13:02:49 -07:00
zcommon Refactor ccompile.h to not include system headers 2020-07-25 20:09:50 -07:00
zfs zfs promote does not delete livelist of origin 2020-07-31 08:59:00 -07:00
.gitignore Cleanup linux module kbuild files 2020-06-10 09:24:15 -07:00
Kbuild.in Move zfs_gitrev.h to build directory 2020-06-24 18:19:28 -07:00
Makefile.bsd Prefix zfs internal endian checks with _ZFS 2020-07-28 13:02:49 -07:00
Makefile.in Include FreeBSD sources in module dist 2020-06-26 14:19:35 -07:00