Thu Dec 6 09:58:52 2018 UTC ()
Add missing ZFS_OBJ_HOLD_ENTER() / ZFS_OBJ_HOLD_EXIT() to zfs_zget_cleaner().


(hannken)
diff -r1.22 -r1.23 src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_znode.c

cvs diff -r1.22 -r1.23 src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_znode.c (expand / switch to unified diff)

--- src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_znode.c 2018/11/28 09:55:36 1.22
+++ src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_znode.c 2018/12/06 09:58:52 1.23
@@ -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
1182int 1182int
1183zfs_zget_cleaner(zfsvfs_t *zfsvfs, uint64_t obj_num, znode_t **zpp) 1183zfs_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
1217int 1223int
1218zfs_loadvnode(struct mount *mp, struct vnode *vp, 1224zfs_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{