From c9ada6d5a00ba66fd54d62b4a1684e561fe2c9a4 Mon Sep 17 00:00:00 2001 From: Brian Behlendorf Date: Wed, 17 Jul 2013 09:15:46 -0700 Subject: [PATCH] Fix read-only pool hang on unmount During mount a filesystem dataset would have the MS_RDONLY bit incorrectly cleared even if the entire pool was read-only. There is existing to code to handle this case but it was being run before the property callbacks were registered. To resolve the issue we move this read-only code after the callback registration. Signed-off-by: Brian Behlendorf Closes #1338 --- module/zfs/zfs_vfsops.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/module/zfs/zfs_vfsops.c b/module/zfs/zfs_vfsops.c index 602c332..9ae7ab5 100644 --- a/module/zfs/zfs_vfsops.c +++ b/module/zfs/zfs_vfsops.c @@ -233,10 +233,11 @@ zfs_register_callbacks(zfs_sb_t *zsb) { struct dsl_dataset *ds = NULL; objset_t *os = zsb->z_os; + boolean_t do_readonly = B_FALSE; int error = 0; if (zfs_is_readonly(zsb) || !spa_writeable(dmu_objset_spa(os))) - readonly_changed_cb(zsb, B_TRUE); + do_readonly = B_TRUE; /* * Register property callbacks. @@ -271,6 +272,9 @@ zfs_register_callbacks(zfs_sb_t *zsb) if (error) goto unregister; + if (do_readonly) + readonly_changed_cb(zsb, B_TRUE); + return (0); unregister: -- 1.8.3.1