svn commit: r309099 - head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs

Andriy Gapon avg at FreeBSD.org
Thu Nov 24 10:34:44 UTC 2016


Author: avg
Date: Thu Nov 24 10:34:42 2016
New Revision: 309099
URL: https://svnweb.freebsd.org/changeset/base/309099

Log:
  MFV r308990: 7181 race between zfs_mount and zfs_ioc_rollback
  
  illumos/illumos-gate at 90f2c094b3822f4825f21cef2c2faf7d03b55139
  https://github.com/illumos/illumos-gate/commit/90f2c094b3822f4825f21cef2c2faf7d03b55139
  
  https://www.illumos.org/issues/7181
    zfsvfs_setup() is called in both zfs_mount and zfs_resume_fs paths.
    dmu_objset_set_user(zfsvfs->z_os, zfsvfs) is called early in zfsvfs_setup()
    before the setup is actually completed,
    thus an under-constructed zfsvfs becomes visible.
    Additionally, there is nothing to serialize the two call paths. As a result two
    threads can step on each other's toes.
    assertion failed: zilog->zl_clean_taskq == NULL, file:
    ../../common/fs/zfs/zil.c, line: 1772
  
    > $c
    vpanic()
    0xfffffffffbdf6928()
    zil_open+0x45(ffffff1bbc5dd000, fffffffff7993880)
    zfsvfs_setup+0x84(ffffffb378d77000, 0)
    zfs_resume_fs+0x132(ffffffb378d77000, ffffffb37ddcf000)
    zfs_ioc_rollback+0x96(ffffffb37ddcf000, ffffff01dcdc4cd0, ffffff01aa091000)
    zfsdev_ioctl+0x215(10a00000000, 5a19, 80465f8, 100003, ffffff01ab318368,
    ffffff0004b59e58)
    cdev_ioctl+0x39(10a00000000, 5a19, 80465f8, 100003, ffffff01ab318368,
    ffffff0004b59e58)
    spec_ioctl+0x60(ffffff0197737700, 5a19, 80465f8, 100003,
    ffffff01ab318368, ffffff0004b59e58)
    fop_ioctl+0x55(ffffff0197737700, 5a19, 80465f8, 100003,
    ffffff01ab318368, ffffff0004b59e58)
    ioctl+0x9b(7, 5a19, 80465f8)
    sys_syscall32+0x1f7()
  
    > ffffff1bbc5dd000::print objset_t os_zil
    os_zil = 0xffffff1c053cf7c0
    > 0xffffff1c053cf7c0::print zilog_t zl_clean_taskq
  
  Reviewed by: Matthew Ahrens <mahrens at delphix.com>
  Approved by: Gordon Ross <gordon.w.ross at gmail.com>
  Author: Andriy Gapon <andriy.gapon at clusterhq.com>
  
  MFC after:	2 weeks

Modified:
  head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c
Directory Properties:
  head/sys/cddl/contrib/opensolaris/   (props changed)

Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c	Thu Nov 24 10:29:21 2016	(r309098)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c	Thu Nov 24 10:34:42 2016	(r309099)
@@ -1039,13 +1039,6 @@ zfsvfs_setup(zfsvfs_t *zfsvfs, boolean_t
 	if (error)
 		return (error);
 
-	/*
-	 * Set the objset user_ptr to track its zfsvfs.
-	 */
-	mutex_enter(&zfsvfs->z_os->os_user_ptr_lock);
-	dmu_objset_set_user(zfsvfs->z_os, zfsvfs);
-	mutex_exit(&zfsvfs->z_os->os_user_ptr_lock);
-
 	zfsvfs->z_log = zil_open(zfsvfs->z_os, zfs_get_data);
 
 	/*
@@ -1106,6 +1099,13 @@ zfsvfs_setup(zfsvfs_t *zfsvfs, boolean_t
 		zfsvfs->z_vfs->vfs_flag |= readonly; /* restore readonly bit */
 	}
 
+	/*
+	 * Set the objset user_ptr to track its zfsvfs.
+	 */
+	mutex_enter(&zfsvfs->z_os->os_user_ptr_lock);
+	dmu_objset_set_user(zfsvfs->z_os, zfsvfs);
+	mutex_exit(&zfsvfs->z_os->os_user_ptr_lock);
+
 	return (0);
 }
 


More information about the svn-src-all mailing list