kmem_cache_t *stateowner_slab = NULL;
 kmem_cache_t *file_slab = NULL;
+kmem_cache_t *stateid_slab = NULL;
 
 void
 nfs4_lock_state(void)
 {
        nfsd4_free_slab(&stateowner_slab);
        nfsd4_free_slab(&file_slab);
+       nfsd4_free_slab(&stateid_slab);
 }
 
 static int
                        sizeof(struct nfs4_file), 0, 0, NULL, NULL);
        if (file_slab == NULL)
                goto out_nomem;
+       stateid_slab = kmem_cache_create("nfsd4_stateids",
+                       sizeof(struct nfs4_stateid), 0, 0, NULL, NULL);
+       if (stateid_slab == NULL)
+               goto out_nomem;
        return 0;
 out_nomem:
        nfsd4_free_slabs();
                vfsclose++;
        } else if (flags & LOCK_STATE)
                locks_remove_posix(filp, (fl_owner_t) stp->st_stateowner);
-       kfree(stp);
+       kmem_cache_free(stateid_slab, stp);
        stp = NULL;
 }
 
        return status;
 }
 
+static inline struct nfs4_stateid *
+nfs4_alloc_stateid(void)
+{
+       return kmem_cache_alloc(stateid_slab, GFP_KERNEL);
+}
+
 static int
 nfs4_new_open(struct svc_rqst *rqstp, struct nfs4_stateid **stpp,
                struct nfs4_delegation *dp,
 {
        struct nfs4_stateid *stp;
 
-       stp = kmalloc(sizeof(struct nfs4_stateid), GFP_KERNEL);
+       stp = nfs4_alloc_stateid();
        if (stp == NULL)
                return nfserr_resource;
 
                if (status) {
                        if (status == nfserr_dropit)
                                status = nfserr_jukebox;
-                       kfree(stp);
+                       kmem_cache_free(stateid_slab, stp);
                        return status;
                }
        }
        struct nfs4_stateid *stp;
        unsigned int hashval = stateid_hashval(sop->so_id, fp->fi_id);
 
-       if ((stp = kmalloc(sizeof(struct nfs4_stateid), 
-                                       GFP_KERNEL)) == NULL)
+       stp = nfs4_alloc_stateid();
+       if (stp == NULL)
                goto out;
        INIT_LIST_HEAD(&stp->st_hash);
        INIT_LIST_HEAD(&stp->st_perfile);