Disable page allocation warnings for super block
[zfs.git] / module / zfs / zfs_znode.c
index 1edbd7e..885d224 100644 (file)
@@ -52,6 +52,7 @@
 #include <sys/zfs_rlock.h>
 #include <sys/zfs_fuid.h>
 #include <sys/zfs_vnops.h>
+#include <sys/zfs_ctldir.h>
 #include <sys/dnode.h>
 #include <sys/fs/zfs.h>
 #include <sys/kidmap.h>
@@ -267,8 +268,12 @@ zfs_inode_destroy(struct inode *ip)
        znode_t *zp = ITOZ(ip);
        zfs_sb_t *zsb = ZTOZSB(zp);
 
+       if (zfsctl_is_node(ip))
+               zfsctl_inode_destroy(ip);
+
        mutex_enter(&zsb->z_znodes_lock);
        list_remove(&zsb->z_all_znodes, zp);
+       zsb->z_nr_znodes--;
        mutex_exit(&zsb->z_znodes_lock);
 
        if (zp->z_acl_cached) {
@@ -352,6 +357,8 @@ zfs_znode_alloc(zfs_sb_t *zsb, dmu_buf_t *db, int blksz,
 
        zp = ITOZ(ip);
        ASSERT(zp->z_dirlocks == NULL);
+       ASSERT3P(zp->z_acl_cached, ==, NULL);
+       ASSERT3P(zp->z_xattr_cached, ==, NULL);
        zp->z_moved = 0;
        zp->z_sa_hdl = NULL;
        zp->z_unlinked = 0;
@@ -361,7 +368,9 @@ zfs_znode_alloc(zfs_sb_t *zsb, dmu_buf_t *db, int blksz,
        zp->z_blksz = blksz;
        zp->z_seq = 0x7A4653;
        zp->z_sync_cnt = 0;
-       zp->z_is_zvol = 0;
+       zp->z_is_zvol = B_FALSE;
+       zp->z_is_mapped = B_FALSE;
+       zp->z_is_ctldir = B_FALSE;
 
        zfs_znode_sa_init(zsb, zp, db, obj_type, hdl);
 
@@ -401,6 +410,7 @@ zfs_znode_alloc(zfs_sb_t *zsb, dmu_buf_t *db, int blksz,
 
        mutex_enter(&zsb->z_znodes_lock);
        list_insert_tail(&zsb->z_all_znodes, zp);
+       zsb->z_nr_znodes++;
        membar_producer();
        mutex_exit(&zsb->z_znodes_lock);
 
@@ -432,6 +442,10 @@ zfs_inode_update(znode_t *zp)
        zsb = ZTOZSB(zp);
        ip = ZTOI(zp);
 
+       /* Skip .zfs control nodes which do not exist on disk. */
+       if (zfsctl_is_node(ip))
+               return;
+
        sa_lookup(zp->z_sa_hdl, SA_ZPL_ATIME(zsb), &atime, 16);
        sa_lookup(zp->z_sa_hdl, SA_ZPL_MTIME(zsb), &mtime, 16);
        sa_lookup(zp->z_sa_hdl, SA_ZPL_CTIME(zsb), &ctime, 16);
@@ -440,7 +454,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,
@@ -613,7 +627,7 @@ zfs_mknode(znode_t *dzp, vattr_t *vap, dmu_tx_t *tx, cred_t *cr,
         * order for  DMU_OT_ZNODE is critical since it needs to be constructed
         * in the old znode_phys_t format.  Don't change this ordering
         */
-       sa_attrs = kmem_alloc(sizeof(sa_bulk_attr_t) * ZPL_END, KM_SLEEP);
+       sa_attrs = kmem_alloc(sizeof(sa_bulk_attr_t) * ZPL_END, KM_PUSHPAGE);
 
        if (obj_type == DMU_OT_ZNODE) {
                SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_ATIME(zsb),
@@ -1488,13 +1502,13 @@ zfs_create_fs(objset_t *os, cred_t *cr, nvlist_t *zplprops, dmu_tx_t *tx)
        vattr.va_uid = crgetuid(cr);
        vattr.va_gid = crgetgid(cr);
 
-       rootzp = kmem_cache_alloc(znode_cache, KM_SLEEP);
+       rootzp = kmem_cache_alloc(znode_cache, KM_PUSHPAGE);
        rootzp->z_moved = 0;
        rootzp->z_unlinked = 0;
        rootzp->z_atime_dirty = 0;
        rootzp->z_is_sa = USE_SA(version, os);
 
-       zsb = kmem_zalloc(sizeof (zfs_sb_t), KM_SLEEP);
+       zsb = kmem_zalloc(sizeof (zfs_sb_t), KM_PUSHPAGE | KM_NODEBUG);
        zsb->z_os = os;
        zsb->z_parent = zsb;
        zsb->z_version = version;
@@ -1502,7 +1516,7 @@ zfs_create_fs(objset_t *os, cred_t *cr, nvlist_t *zplprops, dmu_tx_t *tx)
        zsb->z_use_sa = USE_SA(version, os);
        zsb->z_norm = norm;
 
-       sb = kmem_zalloc(sizeof (struct super_block), KM_SLEEP);
+       sb = kmem_zalloc(sizeof (struct super_block), KM_PUSHPAGE);
        sb->s_fs_info = zsb;
 
        ZTOI(rootzp)->i_sb = sb;