]> granicus.if.org Git - zfs/commit
Suspend/resume zvol for recv and rollback
authorChunwei Chen <tuxoko@gmail.com>
Thu, 19 Jan 2017 21:56:36 +0000 (13:56 -0800)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Thu, 19 Jan 2017 21:56:36 +0000 (13:56 -0800)
commit040dab993936d832df4c7624bbcdb71c3fb9b34b
tree0261aedba3c5e6fdda94a0a10388d065f0802924
parent76fe529b392068dfb7575739542cd4f69d2d4343
Suspend/resume zvol for recv and rollback

When doing recv and rollback, dsl_dataset_clone_swap_sync_impl will be
called to swap out the ds_objset and do dmu_objset_evict on the old one.
However, currently zv->zv_objset will not be swapped out accordingly, so
if anyone currently holds a fd on the zvol, we risk hitting a use-after-free.

We fix this by introducing the suspend and resume mechanism of zsb to
zv.  Before recv or rollback, we use zvol_suspend to block all access to
zv_objset and shut it down. After the recv or rollback, we use zvol_resume
to swap in zv_objset with the new ds_objset and unblock the access.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Chunwei Chen <david.chen@osnexus.com>
Closes #4866
Closes #5609
include/sys/zvol.h
module/zfs/dsl_dataset.c
module/zfs/zfs_ioctl.c
module/zfs/zvol.c