diff options
author | Alan Somers <asomers@FreeBSD.org> | 2020-08-20 01:31:21 +0000 |
---|---|---|
committer | Alan Somers <asomers@FreeBSD.org> | 2020-08-20 01:31:21 +0000 |
commit | 02fa3d2963a4e19c270d689af7bd1980e4d53e08 (patch) | |
tree | 332db636d41f4a16c17d90063d54d8c5d7545de2 /cddl | |
parent | 72c7f24c8d2d136757bb30366d65b7e68943994d (diff) | |
download | src-02fa3d2963a4e19c270d689af7bd1980e4d53e08.tar.gz src-02fa3d2963a4e19c270d689af7bd1980e4d53e08.zip |
zfs: fix EIO accessing dataset after resuming interrupted receive
ZFS unmounts a dataset while receiving into it and remounts it afterwards.
But if ZFS is resuming an incomplete receive, it screws up and ends up with
a dataset that is mounted, but returns EIO for every access. This commit
fixes that condition.
While the vulnerable code also exists in OpenZFS, the problem is not
reproducible there. Apparently OpenZFS doesn't unmount the destination
dataset during receive, like FreeBSD does.
PR: 248606
Reviewed by: mmacy
MFC after: 2 weeks
Sponsored by: Axcient
Differential Revision: https://reviews.freebsd.org/D26034
Notes
Notes:
svn path=/head/; revision=364412
Diffstat (limited to 'cddl')
-rw-r--r-- | cddl/contrib/opensolaris/lib/libzfs/common/libzfs_sendrecv.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_sendrecv.c b/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_sendrecv.c index 71a951027b30..2e2e1020ad8a 100644 --- a/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_sendrecv.c +++ b/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_sendrecv.c @@ -3434,7 +3434,7 @@ zfs_receive_one(libzfs_handle_t *hdl, int infd, const char *tosnap, } if (!flags->dryrun && zhp->zfs_type == ZFS_TYPE_FILESYSTEM && - stream_wantsnewfs) { + (stream_wantsnewfs || resuming)) { /* We can't do online recv in this case */ clp = changelist_gather(zhp, ZFS_PROP_NAME, 0, flags->forceunmount ? MS_FORCE : 0); |