rw_init(&zp->z_parent_lock, NULL, RW_DEFAULT, NULL);
rw_init(&zp->z_name_lock, NULL, RW_DEFAULT, NULL);
mutex_init(&zp->z_acl_lock, NULL, MUTEX_DEFAULT, NULL);
+ rw_init(&zp->z_xattr_lock, NULL, RW_DEFAULT, NULL);
mutex_init(&zp->z_range_lock, NULL, MUTEX_DEFAULT, NULL);
avl_create(&zp->z_range_avl, zfs_range_compare,
zp->z_dirlocks = NULL;
zp->z_acl_cached = NULL;
+ zp->z_xattr_cached = NULL;
zp->z_moved = 0;
return (0);
}
rw_destroy(&zp->z_parent_lock);
rw_destroy(&zp->z_name_lock);
mutex_destroy(&zp->z_acl_lock);
+ rw_destroy(&zp->z_xattr_lock);
avl_destroy(&zp->z_range_avl);
mutex_destroy(&zp->z_range_lock);
ASSERT(zp->z_dirlocks == NULL);
ASSERT(zp->z_acl_cached == NULL);
+ ASSERT(zp->z_xattr_cached == NULL);
}
void
zp->z_acl_cached = NULL;
}
+ if (zp->z_xattr_cached) {
+ nvlist_free(zp->z_xattr_cached);
+ zp->z_xattr_cached = NULL;
+ }
+
kmem_cache_free(znode_cache, zp);
}
atomic_set(&ZTOI(rootzp)->i_count, 0);
sa_handle_destroy(rootzp->z_sa_hdl);
- kmem_free(sb, sizeof (struct super_block));
- kmem_free(zsb, sizeof (zfs_sb_t));
kmem_cache_free(znode_cache, rootzp);
/*
* Create shares directory
*/
-
error = zfs_create_share_dir(zsb, tx);
-
ASSERT(error == 0);
for (i = 0; i != ZFS_OBJ_MTX_SZ; i++)
mutex_destroy(&zsb->z_hold_mtx[i]);
+
+ kmem_free(sb, sizeof (struct super_block));
+ kmem_free(zsb, sizeof (zfs_sb_t));
}
#endif /* _KERNEL */
static int
zfs_grab_sa_handle(objset_t *osp, uint64_t obj, sa_handle_t **hdlp,
- dmu_buf_t **db)
+ dmu_buf_t **db, void *tag)
{
dmu_object_info_t doi;
int error;
- if ((error = sa_buf_hold(osp, obj, FTAG, db)) != 0)
+ if ((error = sa_buf_hold(osp, obj, tag, db)) != 0)
return (error);
dmu_object_info_from_db(*db, &doi);
doi.doi_bonus_type != DMU_OT_ZNODE) ||
(doi.doi_bonus_type == DMU_OT_ZNODE &&
doi.doi_bonus_size < sizeof (znode_phys_t))) {
- sa_buf_rele(*db, FTAG);
+ sa_buf_rele(*db, tag);
return (ENOTSUP);
}
error = sa_handle_get(osp, obj, NULL, SA_HDL_PRIVATE, hdlp);
if (error != 0) {
- sa_buf_rele(*db, FTAG);
+ sa_buf_rele(*db, tag);
return (error);
}
}
void
-zfs_release_sa_handle(sa_handle_t *hdl, dmu_buf_t *db)
+zfs_release_sa_handle(sa_handle_t *hdl, dmu_buf_t *db, void *tag)
{
sa_handle_destroy(hdl);
- sa_buf_rele(db, FTAG);
+ sa_buf_rele(db, tag);
}
/*
int is_xattrdir;
if (prevdb)
- zfs_release_sa_handle(prevhdl, prevdb);
+ zfs_release_sa_handle(prevhdl, prevdb, FTAG);
if ((error = zfs_obj_to_pobj(sa_hdl, sa_table, &pobj,
&is_xattrdir)) != 0)
prevhdl = sa_hdl;
prevdb = sa_db;
}
- error = zfs_grab_sa_handle(osp, obj, &sa_hdl, &sa_db);
+ error = zfs_grab_sa_handle(osp, obj, &sa_hdl, &sa_db, FTAG);
if (error != 0) {
sa_hdl = prevhdl;
sa_db = prevdb;
if (sa_hdl != NULL && sa_hdl != hdl) {
ASSERT(sa_db != NULL);
- zfs_release_sa_handle(sa_hdl, sa_db);
+ zfs_release_sa_handle(sa_hdl, sa_db, FTAG);
}
if (error == 0)
if (error != 0)
return (error);
- error = zfs_grab_sa_handle(osp, obj, &hdl, &db);
+ error = zfs_grab_sa_handle(osp, obj, &hdl, &db, FTAG);
if (error != 0)
return (error);
error = zfs_obj_to_path_impl(osp, obj, hdl, sa_table, buf, len);
- zfs_release_sa_handle(hdl, db);
+ zfs_release_sa_handle(hdl, db, FTAG);
return (error);
}
if (error != 0)
return (error);
- error = zfs_grab_sa_handle(osp, obj, &hdl, &db);
+ error = zfs_grab_sa_handle(osp, obj, &hdl, &db, FTAG);
if (error != 0)
return (error);
error = zfs_obj_to_stats_impl(hdl, sa_table, sb);
if (error != 0) {
- zfs_release_sa_handle(hdl, db);
+ zfs_release_sa_handle(hdl, db, FTAG);
return (error);
}
error = zfs_obj_to_path_impl(osp, obj, hdl, sa_table, buf, len);
- zfs_release_sa_handle(hdl, db);
+ zfs_release_sa_handle(hdl, db, FTAG);
return (error);
}