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

Xin LI delphij at FreeBSD.org
Fri Dec 5 18:29:02 UTC 2014


Author: delphij
Date: Fri Dec  5 18:29:01 2014
New Revision: 275515
URL: https://svnweb.freebsd.org/changeset/base/275515

Log:
  Fix a regression introduced in r274337 (large block support)
  
  In dsl_dataset_hold_obj() we used zap_contains(.., DS_FIELD_LARGE_BLOCKS)
  to determine whether the extensible (zapifyed) dataset have large blocks.
  The code expects the result be either 0 (found) or ENOENT (not found),
  however reused the variable 'err' which later code expects to be 0.
  
  Fix this by adopting similar code construct that is used later for
  DS_FIELD_BOOKMARK_NAMES, which uses a temporary variable zaperr to catch
  errors from zap_* rountines.
  
  Reported by:	Peter J. Creath (on FreeNAS; FreeNAS bug #6848)
  Illumos issue:	5393 spurious failures from dsl_dataset_hold_obj()
  Reviewed by:	mahrens
  Sponsored by:	iXsystems, Inc.
  X-MFC with:	r274337

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

Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c	Fri Dec  5 15:24:42 2014	(r275514)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c	Fri Dec  5 18:29:01 2014	(r275515)
@@ -409,11 +409,11 @@ dsl_dataset_hold_obj(dsl_pool_t *dp, uin
 		    offsetof(dmu_sendarg_t, dsa_link));
 
 		if (doi.doi_type == DMU_OTN_ZAP_METADATA) {
-			err = zap_contains(mos, dsobj, DS_FIELD_LARGE_BLOCKS);
-			if (err == 0)
+			int zaperr = zap_contains(mos, dsobj, DS_FIELD_LARGE_BLOCKS);
+			if (zaperr != ENOENT) {
+				VERIFY0(zaperr);
 				ds->ds_large_blocks = B_TRUE;
-			else
-				ASSERT3U(err, ==, ENOENT);
+			}
 		}
 
 		if (err == 0) {


More information about the svn-src-head mailing list