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

Andriy Gapon avg at FreeBSD.org
Mon Aug 12 10:30:01 UTC 2019


Author: avg
Date: Mon Aug 12 10:30:00 2019
New Revision: 350894
URL: https://svnweb.freebsd.org/changeset/base/350894

Log:
  a stop gap fix for a race between dnode_hold and dnode_sync_free
  
  The race was introduced in r337669, the large dnode feature import from
  ZoL.  The problem was debugged by ZoL developers and then,
  independently, on FreeBSD.
  
  The fix is an early proposal by Brian Behlendorf:
  https://github.com/behlendorf/zfs/commit/50f32ed74e42aa28522e9681fb8ae55239fa33a7
  This fix never went into ZoL.  A larger change that was committed later
  included a different solution because of the re-worked code.
  
  Ideally, we want to revert this fix and re-synchronize FreeBSD large
  dnode code with that in illumos (or newer ZoL).  illumos has a later
  import of the feature from ZoL that does not have the bug.
  
  PR:		236480
  Obtained from:	Brian Behlendorf <behlendorf1 at llnl.gov>
  Submitted by:	ncrogers at gmail.com (patch adaptation)
  Reported by:	ncrogers at gmail.com
  Tested by:	ncrogers at gmail.com,
  		Dennis Noordsij <dennis.noordsij at alumni.helsinki.fi>,
  		Julien Cigar <julien at perdition.city>
  MFC after:	10 days

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

Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dnode.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dnode.c	Mon Aug 12 10:00:32 2019	(r350893)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dnode.c	Mon Aug 12 10:30:00 2019	(r350894)
@@ -1324,7 +1324,9 @@ dnode_hold_impl(objset_t *os, uint64_t object, int fla
 	mutex_enter(&dn->dn_mtx);
 	type = dn->dn_type;
 	if (dn->dn_free_txg ||
-	    ((flag & DNODE_MUST_BE_FREE) && !refcount_is_zero(&dn->dn_holds))) {
+	    ((flag & DNODE_MUST_BE_ALLOCATED) && type == DMU_OT_NONE) ||
+	    ((flag & DNODE_MUST_BE_FREE) &&
+	    (type != DMU_OT_NONE || !refcount_is_zero(&dn->dn_holds)))) {
 		mutex_exit(&dn->dn_mtx);
 		zrl_remove(&dnh->dnh_zrlock);
 		dbuf_rele(db, FTAG);


More information about the svn-src-all mailing list