Linux 3.2 compat: set_nlink()
[zfs.git] / module / zfs / zfs_znode.c
index ea8b4c5..a35e3b5 100644 (file)
@@ -106,6 +106,7 @@ zfs_znode_cache_constructor(void *buf, void *arg, int kmflags)
        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,
@@ -113,6 +114,7 @@ zfs_znode_cache_constructor(void *buf, void *arg, int kmflags)
 
        zp->z_dirlocks = NULL;
        zp->z_acl_cached = NULL;
+       zp->z_xattr_cached = NULL;
        zp->z_moved = 0;
        return (0);
 }
@@ -128,11 +130,13 @@ zfs_znode_cache_destructor(void *buf, void *arg)
        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
@@ -272,6 +276,11 @@ zfs_inode_destroy(struct inode *ip)
                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);
 }
 
@@ -431,7 +440,7 @@ zfs_inode_update(znode_t *zp)
        ip->i_generation = zp->z_gen;
        ip->i_uid = zp->z_uid;
        ip->i_gid = zp->z_gid;
-       ip->i_nlink = zp->z_links;
+       set_nlink(ip, zp->z_links);
        ip->i_mode = zp->z_mode;
        ip->i_blkbits = SPA_MINBLOCKSHIFT;
        dmu_object_size_from_db(sa_get_db(zp->z_sa_hdl), &blksize,
@@ -1527,20 +1536,19 @@ zfs_create_fs(objset_t *os, cred_t *cr, nvlist_t *zplprops, dmu_tx_t *tx)
 
        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 */
 
@@ -1560,12 +1568,12 @@ zfs_sa_setup(objset_t *osp, sa_attr_type_t **sa_table)
 
 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);
@@ -1573,13 +1581,13 @@ zfs_grab_sa_handle(objset_t *osp, uint64_t obj, sa_handle_t **hdlp,
            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);
        }
 
@@ -1587,10 +1595,10 @@ zfs_grab_sa_handle(objset_t *osp, uint64_t obj, sa_handle_t **hdlp,
 }
 
 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);
 }
 
 /*
@@ -1667,7 +1675,7 @@ zfs_obj_to_path_impl(objset_t *osp, uint64_t obj, sa_handle_t *hdl,
                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)
@@ -1699,7 +1707,7 @@ zfs_obj_to_path_impl(objset_t *osp, uint64_t obj, sa_handle_t *hdl,
                        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;
@@ -1709,7 +1717,7 @@ zfs_obj_to_path_impl(objset_t *osp, uint64_t obj, sa_handle_t *hdl,
 
        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)
@@ -1730,13 +1738,13 @@ zfs_obj_to_path(objset_t *osp, uint64_t obj, char *buf, int len)
        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);
 }
 
@@ -1756,19 +1764,19 @@ zfs_obj_to_stats(objset_t *osp, uint64_t obj, zfs_stat_t *sb,
        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);
 }