From 16fa68f07d268192552693f83a747c9141ea726b Mon Sep 17 00:00:00 2001 From: jxiong Date: Wed, 26 Oct 2016 04:21:05 +0800 Subject: [PATCH] Do not upgrade userobj accounting for snapshot dataset 'zfs recv' could disown a living objset without calling dmu_objset_disown(). This will cause the problem that the objset would be released while the upgrading thread is still running. This patch avoids the problem by checking if a dataset is a snapshot before calling dmu_objset_userobjspace_upgrade(). Snapshots are immutable and therefore it doesn't make sense to update them. Reviewed-by: Brian Behlendorf Signed-off-by: Jinshan Xiong Closes #5295 Closes #5328 --- include/sys/dmu_objset.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/sys/dmu_objset.h b/include/sys/dmu_objset.h index 68fb5cffb932..2ec1ec87d87f 100644 --- a/include/sys/dmu_objset.h +++ b/include/sys/dmu_objset.h @@ -190,6 +190,7 @@ boolean_t dmu_objset_userobjspace_present(objset_t *os); static inline boolean_t dmu_objset_userobjspace_upgradable(objset_t *os) { return (dmu_objset_type(os) == DMU_OST_ZFS && + !dmu_objset_is_snapshot(os) && dmu_objset_userobjused_enabled(os) && !dmu_objset_userobjspace_present(os)); }