Fix zfsctl_lookup_objset() deadlock

The zfsctl_snapshot_unmount_delay() function must not be called
from zfsctl_lookup_objset() while it is currently holding the
zfs_snapshot_lock.  This will result in a deadlock.  It is safe
to call zfsctl_snapshot_unmount_delay_impl() directly because the
function already has a reference on the zfs_snapentry_t.

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Chunwei Chen <david.chen@osnexus.com>
Closes #3997
This commit is contained in:
Brian Behlendorf 2015-12-10 15:47:18 -08:00
parent 5e94284fe5
commit f22f900f15

View File

@ -1190,7 +1190,8 @@ zfsctl_lookup_objset(struct super_block *sb, uint64_t objsetid, zfs_sb_t **zsbp)
if (time_after(jiffies, zsb->z_snap_defer_time + if (time_after(jiffies, zsb->z_snap_defer_time +
MAX(zfs_expire_snapshot * HZ / 2, HZ))) { MAX(zfs_expire_snapshot * HZ / 2, HZ))) {
zsb->z_snap_defer_time = jiffies; zsb->z_snap_defer_time = jiffies;
zfsctl_snapshot_unmount_delay(spa, objsetid, zfsctl_snapshot_unmount_cancel(se);
zfsctl_snapshot_unmount_delay_impl(se,
zfs_expire_snapshot); zfs_expire_snapshot);
} }