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
This commit is contained in:
Xin LI 2014-12-05 18:29:01 +00:00
parent 01ca58b23c
commit 26f96d922b

View File

@ -409,11 +409,11 @@ dsl_dataset_hold_obj(dsl_pool_t *dp, uint64_t dsobj, void *tag,
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) {