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

Andriy Gapon avg at FreeBSD.org
Tue Oct 8 11:27:49 UTC 2019


Author: avg
Date: Tue Oct  8 11:27:48 2019
New Revision: 353304
URL: https://svnweb.freebsd.org/changeset/base/353304

Log:
  zfs: use atomic_load_64 to read atomic variable in dmu_object_alloc_impl
  
  As long as we support ZFS on 32-bit platforms we should do this for all
  64-bit variables that are modified in a lockless fashion using atomic
  operations.  Otherwise, there is a risk of a reading a torn value.
  
  Here is a rationale for why I am doing this in dmu_object_alloc_impl:
  - it's very recent code
  - the code deals with object IDs and a number of objects in a file
    system can overflow 32 bits
  - incorrect allocation of an object ID may result in hard to debug
    problems
  - fixing all plain reads of 64-bit atomic variables is not a trivial
    undertaking to do in one shot, so I chose to do it incrementally
  
  MFC after:	3 weeks
  X-MFC after:	r353301, r353176

Modified:
  head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_object.c

Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_object.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_object.c	Tue Oct  8 11:07:16 2019	(r353303)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_object.c	Tue Oct  8 11:27:48 2019	(r353304)
@@ -76,7 +76,11 @@ dmu_object_alloc_impl(objset_t *os, dmu_object_type_t 
 	if (dnodes_per_chunk > L1_dnode_count)
 		dnodes_per_chunk = L1_dnode_count;
 
+#ifdef __FreeBSD__
+	object = atomic_load_64(cpuobj);
+#else
 	object = *cpuobj;
+#endif
 
 	for (;;) {
 		/*


More information about the svn-src-head mailing list