| @@ -1178,43 +1178,49 @@ zfs_zget(zfsvfs_t *zfsvfs, uint64_t obj_ | | | @@ -1178,43 +1178,49 @@ zfs_zget(zfsvfs_t *zfsvfs, uint64_t obj_ |
1178 | | | 1178 | |
1179 | return zfs_do_zget(zfsvfs, obj_num, zpp, vcache_get); | | 1179 | return zfs_do_zget(zfsvfs, obj_num, zpp, vcache_get); |
1180 | } | | 1180 | } |
1181 | | | 1181 | |
1182 | int | | 1182 | int |
1183 | zfs_zget_cleaner(zfsvfs_t *zfsvfs, uint64_t obj_num, znode_t **zpp) | | 1183 | zfs_zget_cleaner(zfsvfs_t *zfsvfs, uint64_t obj_num, znode_t **zpp) |
1184 | { | | 1184 | { |
1185 | dmu_buf_t *db; | | 1185 | dmu_buf_t *db; |
1186 | sa_handle_t *hdl; | | 1186 | sa_handle_t *hdl; |
1187 | dmu_object_info_t doi; | | 1187 | dmu_object_info_t doi; |
1188 | znode_t *zp; | | 1188 | znode_t *zp; |
1189 | int err; | | 1189 | int err; |
1190 | | | 1190 | |
| | | 1191 | ZFS_OBJ_HOLD_ENTER(zfsvfs, obj_num); |
| | | 1192 | |
1191 | err = sa_buf_hold(zfsvfs->z_os, obj_num, NULL, &db); | | 1193 | err = sa_buf_hold(zfsvfs->z_os, obj_num, NULL, &db); |
1192 | if (err) { | | 1194 | if (err) { |
| | | 1195 | ZFS_OBJ_HOLD_EXIT(zfsvfs, obj_num); |
1193 | return (SET_ERROR(err)); | | 1196 | return (SET_ERROR(err)); |
1194 | } | | 1197 | } |
1195 | | | 1198 | |
1196 | dmu_object_info_from_db(db, &doi); | | 1199 | dmu_object_info_from_db(db, &doi); |
1197 | if (doi.doi_bonus_type != DMU_OT_SA && | | 1200 | if (doi.doi_bonus_type != DMU_OT_SA && |
1198 | (doi.doi_bonus_type != DMU_OT_ZNODE || | | 1201 | (doi.doi_bonus_type != DMU_OT_ZNODE || |
1199 | (doi.doi_bonus_type == DMU_OT_ZNODE && | | 1202 | (doi.doi_bonus_type == DMU_OT_ZNODE && |
1200 | doi.doi_bonus_size < sizeof (znode_phys_t)))) { | | 1203 | doi.doi_bonus_size < sizeof (znode_phys_t)))) { |
1201 | sa_buf_rele(db, NULL); | | 1204 | sa_buf_rele(db, NULL); |
| | | 1205 | ZFS_OBJ_HOLD_EXIT(zfsvfs, obj_num); |
1202 | return (SET_ERROR(EINVAL)); | | 1206 | return (SET_ERROR(EINVAL)); |
1203 | } | | 1207 | } |
1204 | hdl = dmu_buf_get_user(db); | | 1208 | hdl = dmu_buf_get_user(db); |
1205 | KASSERT(hdl != NULL); | | 1209 | ASSERT3P(hdl, !=, NULL); |
1206 | zp = sa_get_userdata(hdl); | | 1210 | zp = sa_get_userdata(hdl); |
| | | 1211 | ASSERT3U(zp->z_id, ==, obj_num); |
1207 | sa_buf_rele(db, NULL); | | 1212 | sa_buf_rele(db, NULL); |
| | | 1213 | ZFS_OBJ_HOLD_EXIT(zfsvfs, obj_num); |
1208 | *zpp = zp; | | 1214 | *zpp = zp; |
1209 | return (0); | | 1215 | return (0); |
1210 | } | | 1216 | } |
1211 | | | 1217 | |
1212 | /* | | 1218 | /* |
1213 | * Callback from vcache to set up the znode. | | 1219 | * Callback from vcache to set up the znode. |
1214 | * This is largely copied from zfs_znode_alloc(). | | 1220 | * This is largely copied from zfs_znode_alloc(). |
1215 | */ | | 1221 | */ |
1216 | | | 1222 | |
1217 | int | | 1223 | int |
1218 | zfs_loadvnode(struct mount *mp, struct vnode *vp, | | 1224 | zfs_loadvnode(struct mount *mp, struct vnode *vp, |
1219 | const void *key, size_t key_len, const void **new_key) | | 1225 | const void *key, size_t key_len, const void **new_key) |
1220 | { | | 1226 | { |