--- sys/cddl/contrib/opensolaris/uts/common/fs/zfs/space_map.c 28 Mar 2008 22:16:10 -0000 1.2 +++ sys/cddl/contrib/opensolaris/uts/common/fs/zfs/space_map.c 19 Jul 2008 22:15:22 -0000 @@ -300,6 +300,7 @@ space_map_load(space_map_t *sm, space_ma uint64_t *entry, *entry_map, *entry_map_end; uint64_t bufsize, size, offset, end, space; uint64_t mapstart = sm->sm_start; + int error = 0; ASSERT(MUTEX_HELD(sm->sm_lock)); @@ -337,9 +338,10 @@ space_map_load(space_map_t *sm, space_ma smo->smo_object, offset, size); mutex_exit(sm->sm_lock); - VERIFY3U(dmu_read(os, smo->smo_object, offset, size, - entry_map), ==, 0); + error = dmu_read(os, smo->smo_object, offset, size, entry_map); mutex_enter(sm->sm_lock); + if (error != 0) + goto out; entry_map_end = entry_map + (size / sizeof (uint64_t)); for (entry = entry_map; entry < entry_map_end; entry++) { @@ -356,18 +358,19 @@ space_map_load(space_map_t *sm, space_ma } VERIFY3U(sm->sm_space, ==, space); + sm->sm_loaded = B_TRUE; + sm->sm_ops = ops; +out: zio_buf_free(entry_map, bufsize); sm->sm_loading = B_FALSE; - sm->sm_loaded = B_TRUE; - sm->sm_ops = ops; cv_broadcast(&sm->sm_load_cv); - if (ops != NULL) + if (!error && ops != NULL) ops->smop_load(sm); - return (0); + return (error); } void